MISP
Интеграция с Malware Information Sharing Platform (MISP)
Данное руководство описывает настройку интеграции Solar TI Feeds Agent с MISP. Интеграция обеспечивает автоматическую загрузку индикаторов компрометации (IoC) из Solar TI Feeds в MISP через промежуточное хранение в локальной базе данных.
Предварительные требования
- Установленный и настроенный Solar TI Feeds Agent
- Учётные данные для доступа к API MISP (токен аутентификации)
- Доступ к серверу Solar TI Feeds с действительным JWT-токеном
Конфигурация интеграции
Интеграция реализована двумя пайплайнами, которые обеспечивают надёжное получение, промежуточное хранение и доставку индикаторов в MISP, включая повторную обработку неудачных попыток. Аутентификация в MISP выполняется через HTTP-заголовок Authorization с токеном.
Основные компоненты интеграции:
| Компонент | Назначение |
|---|---|
FeedsAPIGenerator | Загрузка данных из Solar TI Feeds API |
FeedsDBSink | Сохранение данных в локальную SQLite-базу |
FeedsDBGenerator | Чтение данных из базы для обработки |
FeedsDBFailedGenerator | Повторная обработка ошибочных записей |
MispSink | Отправка полученных индикаторов напрямую в API MISP (без дополнительных преобразований) |
Переменные окружения
Для работы интеграции необходимо определить следующие переменные окружения (например, в docker-compose.yml):
| Переменная | Назначение |
|---|---|
TIC_AGENT_MISP_ADDRESS | Полный URL сервера MISP (например, https://misp.example.com) |
TIC_AGENT_MISP_TOKEN | Токен аутентификации для API MISP |
TIC_AGENT_MISP_USER | Имя пользователя для Basic-аутентификации (опционально) |
TIC_AGENT_MISP_PASSWORD | Пароль для Basic-аутентификации (опционально) |
TIC_AGENT_MISP_PROXY | Строка подключения к прокси-серверу для MISP (например, socks5://user:password@proxy.domain:port) |
Дополнительные параметры (расписание, путь к БД и пр.) задаются в файле internal/templates.pkl.
Структура пайплайнов для MISP
Pipeline 1: feeds-api (загрузка данных)
| Компонент | Параметры | Описание |
|---|---|---|
FeedsAPIGenerator | server = templates.TICApiCfg; schedule = значение из TIC_AGENT_API_POOL_INTERVAL (по умолчанию 3600 с); filter = с полем fields = "all" и пагинацией с limit из TIC_AGENT_API_BATCH_SIZE (по умолчанию 1000) | Запрос индикаторов из Solar TI Feeds API с настройкой полей и пагинации |
FeedsDBSink | – | Сохранение всех полученных данных в SQLite |
Pipeline 2: misp (обработка и выгрузка)
| Компонент | Параметры | Описание |
|---|---|---|
FeedsDBGenerator | schedule = из TIC_AGENT_DB_POOL_INTERVAL (по умолчанию 600 с); delay = из TIC_AGENT_DB_START_DELAY (по умолчанию 60 с); batchSize = из TIC_AGENT_DB_BATCH_SIZE (по умолчанию 100); batchDelay = из TIC_AGENT_DB_BATCH_DELAY (по умолчанию 100 мс) | Чтение индикаторов из БД с настраиваемыми параметрами пакетной обработки |
FeedsDBFailedGenerator | feedGenName = "misp-feeds-db-generator" | Повторная обработка индикаторов, отправка которых ранее завершилась ошибкой (наследует расписание и задержки от основного генератора) |
MispSink | server с адресом (TIC_AGENT_MISP_ADDRESS), токеном (заголовок Authorization), опциональным прокси (TIC_AGENT_MISP_PROXY) | Отправка подготовленных событий напрямую в API MISP (без промежуточных трансформаций) |
Условия повторной обработки:
Индикаторы, не отправленные из-за ошибок, автоматически помечаются в БД и подхватываются FeedsDBFailedGenerator для повторной попытки с теми же интервалами, что и основной генератор.
Справочник параметров для MispSink
Параметры ServerCfg (подключение к MISP)
| Параметр | Тип данных | Обязательность | Описание | Пример |
|---|---|---|---|---|
credentials | HeaderAuth | Да | Аутентификация через заголовок. name = "Authorization", value содержит токен. | credentials = new HeaderAuth { name = "Authorization" value = read("env:TIC_AGENT_MISP_TOKEN") } |
address | String | Да | Полный URL API MISP | address = read("env:TIC_AGENT_MISP_ADDRESS") |
insecureSkipVerify | Boolean | Нет | Отключение проверки SSL-сертификата | insecureSkipVerify = true |
proxy | String | Нет | Строка подключения к прокси-серверу для MISP | proxy = read?("env:TIC_AGENT_MISP_PROXY") |
Параметры MispSink
| Параметр | Тип данных | Обязательность | Описание |
|---|---|---|---|
server | ServerCfg | Да | Конфигурация подключения к MISP (адрес и токен) |
customTags | Listing<String> | Нет | Список кастомных тегов, добавляемых ко всем отправляемым событиям |
Полный пример конфигурационного файла для интеграции с MISP
📄 Нажмите, чтобы показать/скрыть misp_pipeline.pkl
amends "package://pkg.pkl-lang.org/github.com/pipelane/pipelaner/pipelaner@1.3.1#/Pipelaner.pkl"
import "package://pkg.pkl-lang.org/github.com/pipelane/pipelaner/pipelaner@1.3.1#/source/Components.pkl"
import "../pkl/internal/agent.pkl"
import "../pkl/internal/templates.pkl"
pipelines {
new Components.Pipeline {
name = "feeds-api"
inputs {
new agent.FeedsAPIGenerator {
name = "feeds-api-generator"
server = templates.TICApiCfg
schedule = (read?("env:TIC_AGENT_API_POOL_INTERVAL") ?? 3600).toInt().s
filter = new agent.FeedsAPIRequestParams {
fields = new Listing {
"all"
}
pagination = new agent.Pagination {
limit = (read?("env:TIC_AGENT_API_BATCH_SIZE") ?? 1000).toInt()
}
}
}
}
sinks {
new agent.FeedsDBSink {
name = "feeds-db-sink"
inputs {
"feeds-api-generator"
}
}
}
}
new Components.Pipeline {
name = "misp"
inputs {
new agent.FeedsDBGenerator {
name = "misp-feeds-db-generator"
schedule = (read?("env:TIC_AGENT_DB_POOL_INTERVAL") ?? 600).toInt().s
delay = (read?("env:TIC_AGENT_DB_START_DELAY") ?? 60).toInt().s
batchSize = (read?("env:TIC_AGENT_DB_BATCH_SIZE") ?? 100).toInt()
batchDelay = (read?("env:TIC_AGENT_DB_BATCH_DELAY") ?? 100).toInt().ms
}
new agent.FeedsDBFailedGenerator {
name = "misp-feeds-db-failed-generator"
feedGenName = "misp-feeds-db-generator"
}
}
sinks {
new agent.MispSink {
name = "misp-sink"
inputs {
"misp-feeds-db-generator"
"misp-feeds-db-failed-generator"
}
server = new agent.ServerCfg {
credentials = new agent.HeaderAuth {
name = "Authorization"
value = read("env:TIC_AGENT_MISP_TOKEN")
}
address = read("env:TIC_AGENT_MISP_ADDRESS")
proxy = read?("env:TIC_AGENT_MISP_PROXY")
}
}
}
}
}
settings = templates.baseSettings
Мониторинг результатов работы интеграции
После запуска агента убедитесь в корректности работы:
| Проверка | Действие |
|---|---|
| Проверка состояния БД | Убедитесь, что SQLite-база наполняется индикаторами, а успешно отправленные записи помечаются соответствующим образом. |
| Анализ логов | Проверьте логи агента (в директории, заданной шаблонами) на наличие ошибок подключения к MISP или Feeds API. |
| Верификация в MISP | В интерфейсе MISP должны появляться новые события с индикаторами. |
| Контроль очереди повторов | При временных сбоях индикаторы автоматически повторно отправляются через 1 минуту. Убедитесь, что после восстановления связи они доставляются. |
Примечание: Логи агента также можно просмотреть в реальном времени с помощью команды
docker logs {CONTAINER_NAME}.